package javacal.calculater;
import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import sun.audio.*;
import java.io.*;
import javax.swing.* ;

public class Calculater extends JFrame implements ActionListener { 
/** 计算器上的键的显示名字 */ 
private final String[] DEAD={ "1", "2", "3", "/", "sqrt", "4", "5", "6",
"*", "%",  "7", "8", "9", "-", "1/x", "0", "+/-", ".", "+", "=" }; 
private final String[] TOP={ "Backspace", "CE", "C" }; 
private final String[] M={ "Calculater.hzq", "MC", "MR", "MS", "M+" }; 
private JButton dead[]=new JButton[DEAD.length];  
private JButton top[]=new JButton[TOP.length]; 
private JButton m[]=new JButton[M.length]; 
/** 计算结果文本框 */ 
private JTextField resultText=new JTextField("0"); 
JMenuBar txt; 
JMenuItem txtxt, othertxt;
JMenu txt1, txt2, txt3;

// 按的是否是表达式的第一个数字或者是运算符后的第一个数字 
private boolean firstDigit=true; 
// 计算途中的中间结果。 
private double resultNum=0.0; 
// 当前运算的运算符 
private String operator="="; 
// 操作是否合法 
private boolean operateValidFlag=true; 

/** 
* 构造函数 
*/ 
public Calculater(){ 
super(); 
JMenuBar txt=new JMenuBar(); 
this.setJMenuBar(txt); 
JMenu txt1=new JMenu("编辑"); 
txt.add(txt1); 
txtxt= new JMenuItem("复制 Ctrl+c"); 
txt1.add(txtxt); 
txtxt= new JMenuItem("粘贴 Ctrl+v"); 
txt1.add(txtxt); 
othertxt=new JMenu("其他");
txt1.add(othertxt);
othertxt.add(new JMenuItem("have a bless day"));
othertxt.add(new JMenuItem("It's a long story"));

JMenu txt2=new JMenu("帮助");
txt.add(txt2);
txtxt= new JMenuItem("三角形的面积公式 1/2底乘高"); 
txt2.add(txtxt); 
txtxt= new JMenuItem("矩形面积 长乘宽"); 
txt2.add(txtxt); 
txtxt= new JMenuItem("长方体体积 长乘宽乘高"); 
txt2.add(txtxt); 
txtxt= new JMenuItem("其他"); 
txt2.add(othertxt); 
othertxt.add(new JMenuItem("其他数学公式可自行翻阅课本"));

init(); 
this.setTitle("阿强计算器"); 
//在屏幕(200, 200)坐标处显示计算器 
this.setLocation(200, 200); 
//不许修改计算器的大小 
this.setResizable(false); 
//使计算器中各组件大小合适 
this.pack(); 
} 

/** 
* 初始化计算器 
*/ 
private void init() { 
// 文本框中的数据右对齐
resultText.setHorizontalAlignment(JTextField.RIGHT); 
// 不允许修改结果文本框内容
resultText.setEditable(false); 
// 设置文本框背景颜色为粉色 
resultText.setBackground(Color.pink); 
JPanel mainPanel = new JPanel(); 
//用网格布局器，4行，5列的网格，网格之间的水平方向间隔为8，垂直方向间隔为8
mainPanel.setLayout(new GridLayout(4, 5, 8, 8)); 


for (int i=0; i<DEAD.length; i++) { 
dead[i]=new JButton(DEAD[i]); 
mainPanel.add(dead[i]); 
dead[i].setForeground(Color.orange);      //1，2，3，4，5，6，7，8，9，0，开方，取倒数按钮的颜色
} 

dead[3].setForeground(Color.blue);       //除号的颜色蓝色
dead[8].setForeground(Color.blue);       //乘号的颜色蓝色
dead[13].setForeground(Color.blue);      //减号的颜色蓝色
dead[18].setForeground(Color.blue);      //加号的颜色蓝色
dead[19].setForeground(Color.red);       //等号的颜色红色

JPanel topPanel=new JPanel(); 
//用网格布局器，1行，3列的网格，网格的水平方向间隔为8，垂直方向间隔为8
topPanel.setLayout(new GridLayout(1, 3, 8, 8)); 
for (int i=0; i<TOP.length; i++) { 
top[i]=new JButton(TOP[i]); 
topPanel.add(top[i]); 
top[i].setForeground(Color.red); 
} 

//初始化M键
JPanel MPanel=new JPanel(); 
//用网格布局管理器，5行，1列的网格，网格的水平方向间隔为8，垂直方向间隔为8
MPanel.setLayout(new GridLayout(5, 1, 8, 8)); 
for (int i=0; i<M.length; i++) { 
m[i]=new JButton(M[i]); 
MPanel.add(m[i]); 
m[i].setForeground(Color.red);   //M键为红色
} 

//新建一个画板，将topPanel和MPanel画板放在该画板内 
JPanel panel1=new JPanel(); 
//用边界布局管理器，画板里组件之间的水平为10，垂直方向上间隔为8
panel1.setLayout(new BorderLayout(10, 8)); 
panel1.add("North", topPanel); 
panel1.add("West", mainPanel); 

//建立一个画板放文本框 
JPanel tops=new JPanel(); 
tops.setLayout(new BorderLayout()); 
tops.add("Center", resultText); 

//整体布局 
getContentPane().setLayout(new BorderLayout(10, 15)); 
getContentPane().add("North", tops); 
getContentPane().add("Center", panel1); 
getContentPane().add("West", MPanel);

//为各按钮添加监视器
for (int i=0; i<DEAD.length; i++) { 
dead[i].addActionListener(this); 
} 
for (int i=0; i<TOP.length; i++) { 
top[i].addActionListener(this);  
} 
for (int i=0; i<M.length; i++) { 
m[i].addActionListener(this); 
} 
} 

/** 
* 处理事件 
*/ 
public void actionPerformed(ActionEvent e) { 
String label=e.getActionCommand(); 
if (label.equals(TOP[0])){ 
//按了"Backspace"键 
handleBackspace(); 
} 
else if (label.equals(TOP[1])) { 
//按了"CE"键 
resultText.setText("0"); 
} 
else if (label.equals(TOP[2])){ 
//按了"C"键 
handleC(); 
} 
else if ("0123456789.".indexOf(label) >= 0) { 
//按了数字键或者小数点键 
handleNumber(label); 
} 
else { 
//按了运算符键 
handleOperator(label); 
} 
} 

/** 
* 处理Backspace键被按下的事件 
*/ 
private void handleBackspace() { 
String text=resultText.getText(); 
int i=text.length(); 
if (i>0) { 
//退一格
text=text.substring(0, i - 1); 
if (text.length() == 0) { 
//当文本没有内容，初始化文本框上的数据
resultText.setText("0"); 
firstDigit=true; 
operator = "="; 
} 
else { 
//文本框显示新的文本 
resultText.setText(text); 
} 
} 
} 

/** 
* 处理数字键被按下的事件 
*/ 
private void handleNumber(String deads) { 
if (firstDigit) { 
//输入的第一个数字 
resultText.setText(deads); 
} 
else if ((deads.equals(".")) && (resultText.getText().indexOf(".")<0)){ 
//输入小数点，且文本框没有小数点
resultText.setText(resultText.getText() + "."); 
} 
else if (!deads.equals(".")) { 
//如果按到的按钮不是小数点，数字直接就可以直接在文本框
resultText.setText(resultText.getText() + deads); 
} 
//后面输入的不是第一个数字 
firstDigit=false; 
} 

/** 
* 处理C键被按下的事件 
*/ 
private void handleC() { 
//初始化文本框的值 
resultText.setText("0"); 
firstDigit=true; 
operator = "="; 
} 

/** 
* 处理运算符键被按下的事件 
*/ 
private void handleOperator(String deads) { 
if (operator.equals("/")) { 
//除法
//如果文本框中的值等于0 
if (getNumberFromText() == 0.0){ 
//操作不合法 
operateValidFlag = false; 
resultText.setText("除数不能为零"); 
} 
else { 
resultNum /= getNumberFromText(); 
} 
} 
else if (operator.equals("1/x")) { 
//倒数
if (resultNum == 0.0){ 
//操作不合法 
operateValidFlag = false; 
resultText.setText("零没有倒数"); 
} 
else { 
resultNum = 1/resultNum; 
} 
} 
else if (operator.equals("+")){ 
//加法 
resultNum += getNumberFromText(); 
} 
else if (operator.equals("-")){ 
//减法 
resultNum -= getNumberFromText(); 
} 
else if (operator.equals("*")){ 
//乘法
resultNum *= getNumberFromText(); 
} 
else if (operator.equals("sqrt")) { 
//平方根
resultNum = Math.sqrt(resultNum); 
} 
else if (operator.equals("%")){ 
//百分号除以100 
resultNum = resultNum / 100; 
} 
else if (operator.equals("+/-")){ 
//正数负数转换
resultNum = resultNum * (-1); 
} 
else if (operator.equals("=")){ 
resultNum = getNumberFromText(); 
} 
if (operateValidFlag) { 
//双精度浮点数的运算 
long dead1; 
double dead2; 
dead1=(long) resultNum; 
dead2=resultNum - dead1; 
if(dead2 == 0) { 
resultText.setText(String.valueOf(dead1)); 
} 
else { 
resultText.setText(String.valueOf(resultNum)); 
} 
} 
//运算符与按的按钮一起 
operator=deads; 
firstDigit=true; 
operateValidFlag=true; 
} 

/** 
* 从文本框中获取数字 
* @return 
*/ 
private double getNumberFromText() { 
double result=0; 
try { 
result=Double.valueOf(resultText.getText()).doubleValue(); 
} catch (NumberFormatException e){ 
} 
return result; 
} 

public static void main(String args[]) { 
Calculater calculater=new Calculater(); 
calculater.setVisible(true); 
calculater.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
} 
}